package com.gt.quality.utils;

import lombok.extern.slf4j.Slf4j;
import org.lionsoul.ip2region.xdb.LongByteArray;
import org.lionsoul.ip2region.xdb.Searcher;
import org.lionsoul.ip2region.xdb.Version;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.support.PropertiesLoaderUtils;

import java.util.Properties;


/**
 * 根据ip地址定位工具类，离线方式
 * 参考地址：<a href="https://gitee.com/lionsoul/ip2region/tree/master/binding/java">集成 ip2region 实现离线IP地址定位库</a>
 *
 * @author lishuyan
 */
@Slf4j
public class RegionUtils {
    // 或者你的 ipv4 xdb 的路径
    static final String DB_PATH = "ip2region_v4.xdb";
    static final Version VERSION = Version.IPv4;

    private static Searcher searcher = null;


    public static void init() {
        // 备注：version 和 dbPath 来源，请看上面的版本描述
        ClassPathResource resource = new ClassPathResource("application.properties");
        if (!resource.exists()) {
            log.error("RegionUtils初始化失败！请检查ip2region_v4.xdb文件是否存在！");
            return;
        }
        log.info("RegionUtils初始化开始！");
        // 1、从 dbPath 加载整个 xdb 到内存。从这个 release 版本开始，xdb 的 buffer 使用 LongByteArray 来存储，避免 xdb 文件过大的时候 int 类型的溢出
        LongByteArray cBuff = null;
        try {
            // 获取文件把文件读取为Properties
            Properties properties = PropertiesLoaderUtils.loadProperties(resource);
            cBuff = Searcher.loadContentFromFile(properties.getProperty("sys.ip.utils.xdb"));
        } catch (Exception e) {
            System.out.printf("failed to load content from `%s`: %s\n", DB_PATH, e);
        }

        // 2、使用上述的 cBuff 创建一个完全基于内存的查询对象。
        try {
            searcher = Searcher.newWithBuffer(VERSION, cBuff);
        } catch (Exception e) {
            System.out.printf("failed to create content cached searcher: %s\n", e);
        }
        log.info("RegionUtils初始化成功！");
    }


    /**
     * 根据IP地址离线获取城市
     */
    public static String getCityInfo(String ip) {
        try {
            ip = ip.trim();
            // 3、执行查询
            if (searcher == null) {
                init();
            }
            String region = searcher.search(ip);
            return region.replace("0|", "").replace("|0", "");
        } catch (Exception e) {
            log.error("IP地址离线获取城市异常 {}", ip, e);
            return "未知";
        }
    }

}
